package com.project.utils;

import lombok.extern.slf4j.Slf4j;

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;


@Slf4j
public class DateUtils {

	/** 定义常量 **/
	public static final String DATE_JFP_STR = "yyyyMM";
	public static final String DATE_FULL_STR = "yyyy-MM-dd HH:mm:ss";
	public static final String DATE_SMALL_STR = "yyyy-MM-dd";
	public static final String DATE_KEY_STR = "yyMMddHHmmss";
	public static final String DATE_FULL_STR_CN = "yyyy年MM月dd日 HH:mm:ss";
	public static final String DATE_SMALL_STR_CN = "yyyy年MM月dd日";
	public static final String DATE_JFP_STR1 = "yyyyMMdd";

	/**
	 * 使用预设格式提取字符串日期
	 * 
	 * @param strDate
	 *            日期字符串
	 * @return
	 */
	public static Date parse(String strDate) {
		return parse(strDate, DATE_FULL_STR);
	}

	/**
	 * 使用用户格式提取字符串日期
	 * 
	 * @param strDate
	 *            日期字符串
	 * @param pattern
	 *            日期格式
	 * @return
	 */
	public static Date parse(String strDate, String pattern) {
		SimpleDateFormat df = new SimpleDateFormat(pattern);
		try {
			return df.parse(strDate);
		} catch (ParseException e) {
			return null;
		}
	}

	/**
	 * 使用用户格式提取字符串日期
	 * 
	 * @Description
	 * @author cc@bornsoft.cn
	 * @date 2020年4月14日
	 */
	public static Date parse(String strDate, SimpleDateFormat df) {
		try {
			return df.parse(strDate);
		} catch (ParseException e) {
			return null;
		}
	}

	/**
	 * 获取系统当前时间
	 * 
	 * @return
	 */
	public static String getNowTime() {
		SimpleDateFormat df = new SimpleDateFormat(DATE_FULL_STR);
		return df.format(new Date());
	}

	/**
	 * 获取系统当前时间
	 * 
	 * @return
	 */
	public static String getNowTime(String type) {
		SimpleDateFormat df = new SimpleDateFormat(type);
		return df.format(new Date());
	}

	/**
	 * 将指定的日期转换成Unix时间戳
	 * 
	 * @param date 需要转换的日期 yyyy-MM-dd HH:mm:ss
	 * @return long 时间戳
	 */
	public static long dateToUnixTimestamp(String date) {
		long timestamp = 0;
		try {
			timestamp = new SimpleDateFormat(DATE_FULL_STR).parse(date).getTime();
		} catch (ParseException e) {
			log.error(e.toString());
		}
		return timestamp;
	}

	/**
	 * 将指定的日期转换成Unix时间戳
	 * 
	 * @param  date 需要转换的日期 yyyy-MM-dd
	 * @return long 时间戳
	 */
	public static long dateToUnixTimestamp(String date, String dateFormat) {
		long timestamp = 0;
		try {
			timestamp = new SimpleDateFormat(dateFormat).parse(date).getTime();
		} catch (ParseException e) {
			log.error(e.toString());
		}
		return timestamp;
	}

	/**
	 * 将当前日期转换成Unix时间戳
	 * 
	 * @return long 时间戳
	 */
	public static long dateToUnixTimestamp() {
		long timestamp = new Date().getTime();
		return timestamp;
	}

	/**
	 * 将Unix时间戳转换成日期
	 * 
	 * @param  timestamp 时间戳
	 * @return String 日期字符串
	 */
	public static String unixTimestampToDate(long timestamp) {
		SimpleDateFormat sd = new SimpleDateFormat(DATE_FULL_STR);
		sd.setTimeZone(TimeZone.getTimeZone("GMT+8"));
		return sd.format(new Date(timestamp));
	}

	/**
	 * 判断日期格式
	 * 
	 * @title
	 * @return
	 * @author cc
	 */
	public static boolean isValidDate(String dateStr, String pattern) {
		boolean status = false;
		SimpleDateFormat format = new SimpleDateFormat(pattern);
		try {
			Date date = format.parse(dateStr);
			if (dateStr.equals(format.format(date))) {
				status = true;
			}
		} catch (Exception e) {
			status = false;
		}
		return status;
	}

	/**
	 * 判断日期格式
	 * 
	 * @Description
	 * @author cc@bornsoft.cn
	 * @date 2020年4月14日
	 */
	public static boolean isValidDate(String dateStr, SimpleDateFormat format) {
		boolean status = false;
		try {
			Date date = format.parse(dateStr);
			if (dateStr.equals(format.format(date))) {
				status = true;
			}
		} catch (Exception e) {
			status = false;
		}
		return status;
	}

	/**
	 * 日期类型转string类型
	 * 
	 * @title
	 * @param date
	 * @param pattern
	 * @return
	 * @author cc
	 */
	public static String parse2str(Date date, String pattern) {
		String str = null;
		try {
			SimpleDateFormat sdf = new SimpleDateFormat(pattern);
			str = sdf.format(date);
		} catch (Exception e) {
			log.error(e.toString());
		}
		return str;
	}

	/**
	 * 日期转换格式
	 * 
	 * @title
	 * @param dateStr
	 * @param pattern1
	 *            现格式
	 * @param pattern2
	 *            转换的格式
	 * @return
	 * @author cc
	 */
	public static String parse2str(String dateStr, String pattern1, String pattern2) {
		String str = null;
		try {
			Date date = new SimpleDateFormat(pattern1).parse(dateStr);
			str = new SimpleDateFormat(pattern2).format(date);
		} catch (ParseException e) {
			log.error(e.toString());
		}
		return str;
	}

	/**
	 * 日期格式转换
	 * 
	 * @Description
	 * @author cc@bornsoft.cn
	 * @date 2020年4月14日
	 */
	public static String parse2str(String dateStr, SimpleDateFormat before, SimpleDateFormat after) {
		String str = null;
		try {
			str = after.format(before.parse(dateStr));
		} catch (ParseException e) {
			log.error(e.toString());
		}
		return str;
	}

	/**
	 * 根据小写数字格式的日期转换成大写格式的日期
	 * 
	 * @param date
	 *            8位：支持yyyy-MM-dd、yyyy/MM/dd、yyyyMMdd等格式
	 * @param date
	 *            6位：支持yyyy-MM、yyyy/MM、yyyyMM等格式
	 * @return
	 */
	public static String getUpperDate(String date) {
		char[] upper = "零一二三四五六七八九十".toCharArray();

		// 支持yyyy-MM-dd、yyyy/MM/dd、yyyyMMdd等格式
		if (date == null)
			return null;
		// 非数字的都去掉
		date = date.replaceAll("\\D", "");
		if (date.length() != 8 && date.length() != 6)
			return null;
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < 4; i++) {// 年
			sb.append(upper[Integer.parseInt(date.substring(i, i + 1))]);
		}
		sb.append("年");// 拼接年
		int month = Integer.parseInt(date.substring(4, 6));
		if (month <= 10) {
			sb.append(upper[month]);
		} else {
			sb.append("十").append(upper[month % 10]);
		}
		sb.append("月");// 拼接月

		if (date.length() == 8) {
			int day = Integer.parseInt(date.substring(6));
			if (day <= 10) {
				sb.append(upper[day]);
			} else if (day < 20) {
				sb.append("十").append(upper[day % 10]);
			} else {
				sb.append(upper[day / 10]).append("十");
				int tmp = day % 10;
				if (tmp != 0)
					sb.append(upper[tmp]);
			}
			sb.append("日");// 拼接日
		}
		return sb.toString();
	}

	public static TimeZone DEFAULT_SERVER_TIME_ZONE = TimeZone.getTimeZone("GMT+08:00");

	/**
	 * 设置年、月、日、时、分、秒，并转换成时间戳
	 * 
	 * @param year
	 *            年
	 * @param month
	 *            月
	 * @param day
	 *            日
	 * @param hours
	 *            时
	 * @param minutes
	 *            钟
	 * @param seconds
	 *            秒
	 */
	public static long getTimeInMillis(int year, int month, int day, int hours, int minutes, int seconds) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTimeZone(DEFAULT_SERVER_TIME_ZONE);
		calendar.set(year, month - 1, day, hours, minutes, seconds);
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
		format.setTimeZone(DEFAULT_SERVER_TIME_ZONE);
		try {
			return format.parse(format.format(calendar.getTime())).getTime();
		} catch (ParseException e) {
			e.printStackTrace();
			return 0;
		}
	}

	/**
	 * 设置timeStamp，并转换成时间戳
	 * 
	 * @param timestamp
	 *            传入时间 年
	 */
	public static long getTimeInMillis(Timestamp timestamp) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTimeZone(DEFAULT_SERVER_TIME_ZONE);
		calendar.setTime(timestamp);
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
		format.setTimeZone(DEFAULT_SERVER_TIME_ZONE);
		try {
			return format.parse(format.format(calendar.getTime())).getTime();
		} catch (ParseException e) {
			e.printStackTrace();
			return 0;
		}
	}
}
